题目描述

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

分析

第一感觉是和我之前做过的题类似,就想先排序然后左右指针来夹逼,后面一想,排序之后数组下标就乱了,所以这个方法不行

考虑到可以使用一个map,存储的键值对为:target-val:index,也就是对于数组中的每一个数字,存下它和target的差距以及它的下标。

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
  if(nums === null || nums.length < 2)
    return [];
  var map = {};
  for(var i = 0;i < nums.length;i++) {
    map[target-nums[i]] = i;
  }
  
  for(var i = 0;i < nums.length;i++) {
    var cur = nums[i];
    if(map[cur] && map[cur] !== i)
      return [i, map[cur]];
  }
  
  return [];
};

耳东
766 声望51 粉丝

知乎专栏:[链接]